//
// Created by alice on 25-4-23.
//

#ifndef TAG_H
#define TAG_H

#include <utility>
#include <vector>
#include <set>
#include <cmath>

using std::pair;

typedef pair<double,double> Location; //这个是位置
typedef double Rota; //这个是朝向

enum Tag { //表示兵种关键词的枚举

    Land, //描述一个兵种可在陆地上移动
    Ocean, //描述一个兵种可在海上航行
    Sky, //描述一个兵种可在空中飞行


    OneWay, //描述一个兵种只能前进和后退，想去其它方向必须先转向
    Free,//描述一个兵种可以在不转向的情况下向任意方向移动


    NotSkyAtk, //描述一个兵种可以攻击在空中以外的地形的单位
    SkyAtk, //描述一个兵种可以攻击空中单位


    Build, //描述一个兵种可以建设建筑
    Create, //描述一个兵种可以创建其他兵种

};

//这个是检查函数默认的空函数
template<typename T>
T Default(T& target , const T& Max) {
    return target;
}

//这个可以用于各类数值的变化并进行检查，传入的四个参数分别是变化目标，变化速率，用于检查函数的检查值，检查函数
//其中，检查值和检查函数是可选的，默认参数是0和一个空函数
//检查函数是要单独写的，它是把传入的值与检查值做对比来得出某种结果
template<typename T>
T Change(T & target ,const T & speed , const T & Max = 0, T (*check)(T& ,const T&) = Default) {
    target += speed;
    check(target , Max);
    return target;
}

//重载了两个pair之间的减号
Location operator-( const Location & a,const Location & b);

//重载了两个pair之间的加号
Location operator+( const Location & a,const Location & b);

double operator*(const Location &a, const Location &b);


#endif //TAG_H
